﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Transactions;
using Dominio;
using Negocio;

namespace Presentacion.Comanda
{
    public partial class FrmComanda : Form
    {
        public FrmComanda()
        {
            InitializeComponent();
        }

        DataTable _dtProducto = new DataTable();
        public int coMesa = 0;
        public string _noMesa = string.Empty;
        List<DetalleComanda> _nuevasComandas = new List<DetalleComanda>();

        private void TablaGeneral()
        {
            _dtProducto.Columns.Add("CodigoProducto");
            _dtProducto.Columns.Add("Producto");
            _dtProducto.Columns.Add("Precio");
            _dtProducto.Columns.Add("Cantidad");
            _dtProducto.Columns.Add("SubTotal");
        }

        public string GetTime()
        {
            string fecha = DateTime.Now.ToLongTimeString();

            string TimeInString = "";

            // Get current time
            int hour = Convert.ToInt32(fecha.Substring(0, 2));  //fecha.Substring(11,2)
            int min = Convert.ToInt32(fecha.Substring(3, 2));   //fecha.Substring(14, 2)
            int sec = Convert.ToInt32(fecha.Substring(6, 2));   //fecha.Substring(17, 2)

            // Format current time into string
            if (hour < 10)
            {
                TimeInString = "0" + hour.ToString();
            }
            else
            {
                TimeInString = hour.ToString();
            }

            if (min < 10)
            {
                TimeInString += ":" + "0" + min.ToString();
            }
            else
            {
                TimeInString += ":" + min.ToString();
            }

            if (sec < 10)
            {
                TimeInString += ":" + "0" + sec.ToString();
            }
            else
            {
                TimeInString += ":" + sec.ToString();
            }

            return TimeInString;
        }

        private void FrmComanda_Load(object sender, EventArgs e)
        {
            btnGrabar.Focus();
            txtHora.Text = GetTime();
            txtMesa.Text = _noMesa;
            TablaGeneral();
            //se valida si la mesa seleccionada esta en estado ocupado para mostrar el detalle de su pedido.
            int codigoComanda = new MaestroComanda_Log().Log_MaestroComanda_Validar(coMesa);
            //se valida si tienes algun pedido que este en proceso de atencion.
            VerificarPedido(codigoComanda);
            Categoria_List();
            dgPedidos.ClearSelection();
        }

        private void VerificarPedido(int _codigoMaestro)
        {
            List<DetalleComanda> _detalleList = new List<DetalleComanda>();
            _detalleList = new DetalleComanda_Log().Log_DetalleComanda_List(_codigoMaestro);
            if (_detalleList.Count > 0)
            {
                foreach (DetalleComanda item in _detalleList)
                {
                    DataRow _rows = _dtProducto.NewRow();
                    _rows["CodigoProducto"] = item.Producto.coProducto.ToString();
                    _rows["Producto"] = item.Producto.noProducto;
                    _rows["Precio"] = item.precio.ToString("N");
                    _rows["Cantidad"] = item.cantidadProducto.ToString();
                    _rows["SubTotal"] = item.subTotal.ToString("N");
                    _dtProducto.Rows.Add(_rows);
                }
                dgPedidos.DataSource = _dtProducto;
            }
        }

        private void Categoria_List()
        {
            List<Categoria> _ListaCategoria = new List<Categoria>();
            _ListaCategoria = new Categoria_Log().Log_Mesas_List();
            flowLayoutPanel1.Controls.Clear();
            foreach (Categoria item in _ListaCategoria)
            {
                Button btnDynamicButton = new Button();
                btnDynamicButton.Name = item.coCategoria.ToString();
                btnDynamicButton.Text = item.noCategoria;
                btnDynamicButton.Size = new System.Drawing.Size(152, 76);
                btnDynamicButton.BackColor = Color.White;
                btnDynamicButton.Click += new EventHandler(this.btnDynamicButton_Click);
                flowLayoutPanel1.Controls.Add(btnDynamicButton);
            }
        }

        protected void btnDynamicButton_Click(object sender, EventArgs e)
        {
            Button dynamicButton = (sender as Button);
            string codigoCategoria = dynamicButton.Name;
            SubCategoria_List(Convert.ToInt32(codigoCategoria));
        }

        private void SubCategoria_List(int codigoCategoria)
        {
            List<SubCategoria> _ListaSubCategoria = new List<SubCategoria>();
            _ListaSubCategoria = new SubCategoria_Log().Log_SubCategoria_List(codigoCategoria);
            flowLayoutPanel1.Controls.Clear();
            foreach (SubCategoria item in _ListaSubCategoria)
            {
                Button btnDynamicButton = new Button();
                btnDynamicButton.Name = item.coSubCategoria.ToString();
                btnDynamicButton.Text = item.noSubCategoria;
                btnDynamicButton.Size = new System.Drawing.Size(152, 76);
                btnDynamicButton.BackColor = Color.White;
                btnDynamicButton.Click += new EventHandler(this.btnDynamicButtonProducto_Click);
                flowLayoutPanel1.Controls.Add(btnDynamicButton);
            }
        }

        protected void btnDynamicButtonProducto_Click(object sender, EventArgs e)
        {
            Button dynamicButton = (sender as Button);
            string codigoCategoria = dynamicButton.Name;
            Producto_List(Convert.ToInt32(codigoCategoria));
        }

        protected void btnProductoAdd_Click(object sender, EventArgs e)
        {
            Button dynamicButton = (sender as Button);
            int codigo = Convert.ToInt32(dynamicButton.Name);
            string nombre = dynamicButton.Text;
            Dominio.Producto _producto = new Producto_Log().Log_Producto_Precio(codigo);
            //se agrega un nuevo producto a la lista de pedidos del cliente.
            Comanda(codigo, nombre, _producto.precio);
            dgPedidos.ClearSelection();
        }

        private void Producto_List(int codigoSubProducto)
        {
            List<Producto> _listaProducto = new List<Producto>();
            _listaProducto = new Producto_Log().Log_Producto_List(codigoSubProducto);
            flowLayoutPanel2.Controls.Clear();
            foreach (Producto item in _listaProducto)
            {
                Button btnDynamicButton = new Button();
                btnDynamicButton.Name = item.coProducto.ToString();
                btnDynamicButton.Text = item.noProducto;
                btnDynamicButton.Size = new System.Drawing.Size(152, 76);
                btnDynamicButton.BackColor = Color.White;
                btnDynamicButton.Click += new EventHandler(this.btnProductoAdd_Click);
                flowLayoutPanel2.Controls.Add(btnDynamicButton);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Categoria_List();
            flowLayoutPanel2.Controls.Clear();
        }

        private void Comanda(int codigoProducto, string nombreProducto, decimal precioProducto)
        {
            //se verifica si el producto existe en la lista solicitada
            DataRow[] datos = _dtProducto.Select("CodigoProducto = " + codigoProducto.ToString());
            if (datos.Count() == 0)
            {
                DataRow _rows = _dtProducto.NewRow();
                _rows["CodigoProducto"] = codigoProducto.ToString();
                _rows["Producto"] = nombreProducto;
                _rows["Precio"] = precioProducto.ToString("N");
                _rows["Cantidad"] = "1";
                //se busca el el precio del producto para indicar el sub total.
                string _precioProducto = subTotalProducto(codigoProducto, 1);

                _rows["SubTotal"] = _precioProducto.ToString();
                _dtProducto.Rows.Add(_rows);
                dgPedidos.DataSource = _dtProducto;
            }
        }

        /// <summary>
        /// subtotal del producto que se agrega a la lista de pedidos.
        /// </summary>
        /// <param name="codigoProducto">codigo del producto a buscar el precio</param>
        /// <param name="cantidad">cantidad solicitado</param>
        /// <returns>Sub total</returns>
        private string subTotalProducto(int codigoProducto, int cantidad)
        {
            Dominio.Producto _producto = new Dominio.Producto();
            _producto = new Producto_Log().Log_Producto_Precio(codigoProducto);
            decimal _precioProducto = 0M;
            _precioProducto = (_producto.precio * cantidad);

            return _precioProducto.ToString("N");
        }

        private void button2_Click(object sender, EventArgs e)
        {
           
        }

        private void btnPapelera_Click(object sender, EventArgs e)
        {
            _dtProducto.Rows.Clear();
            dgPedidos.DataSource = _dtProducto;
        }

        private void btnEliminarPedido_Click(object sender, EventArgs e)
        {
            _dtProducto.Rows.RemoveAt(dgPedidos.SelectedRows[0].Index);
        }

        private void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                using (TransactionScope tranx = new TransactionScope(TransactionScopeOption.Required))
                {
                    MaestroComanda _addMaestro = new MaestroComanda();
                    Mesa _mesa = new Mesa();
                    Persona _persona = new Persona();
                    _mesa.coMesa = coMesa;
                    _persona.coPersona = 3;
                    _addMaestro.Mesa = _mesa;
                    _addMaestro.Persona = _persona;

                    int codigoMaestro = new MaestroComanda_Log().Log_MaestroComanda_Insert(_addMaestro);

                    List<DetalleComanda> _listDetalle = new List<DetalleComanda>();
                    for (int i = 0; i < _dtProducto.Rows.Count; i++)
                    {
                        DetalleComanda _addDetalle = new DetalleComanda();
                        Dominio.Producto _producto = new Producto();
                        MaestroComanda _maestro = new MaestroComanda();
                        _maestro.coMaestroComanda = codigoMaestro;
                        _producto.coProducto = Convert.ToInt32(_dtProducto.Rows[i]["CodigoProducto"].ToString());
                        _addDetalle.maestroComanda = _maestro;
                        _addDetalle.Producto = _producto;
                        _addDetalle.cantidadProducto = Convert.ToInt32(_dtProducto.Rows[i]["Cantidad"].ToString());
                        _addDetalle.precio = Convert.ToDecimal(_dtProducto.Rows[i]["Precio"].ToString());
                        _addDetalle.subTotal = Convert.ToDecimal(_dtProducto.Rows[i]["SubTotal"].ToString()); 
                        _addDetalle.observacion = "poca sal";
                        _listDetalle.Add(_addDetalle);
                        new DetalleComanda_Log().Log_MaestroComanda_Insert(_addDetalle);
                    }
                    tranx.Complete();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
           
        }

        private void dgPedidos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            btnSumar.Enabled = true;
            btnRestar.Enabled = true;
        }

        private void btnSumar_Click(object sender, EventArgs e)
        {
            //se agrega un nuevo pedido al producto seleccionado.
            if (dgPedidos.SelectedRows.Count > 0)
            {
                int _codigoProducto = Convert.ToInt32(dgPedidos.SelectedRows[0].Cells["CodigoProducto"].Value);
                int _cantidad = Convert.ToInt32(dgPedidos.SelectedRows[0].Cells["Cantidad"].Value);
                _cantidad += 1;
                _dtProducto.Rows[dgPedidos.SelectedRows[0].Index]["Cantidad"] = _cantidad;
                _dtProducto.Rows[dgPedidos.SelectedRows[0].Index]["SubTotal"] = subTotalProducto(_codigoProducto, _cantidad);
            }
        }

        private void btnRestar_Click(object sender, EventArgs e)
        {
            if (dgPedidos.SelectedRows.Count > 0)
            {
                int _codigoProducto = Convert.ToInt32(dgPedidos.SelectedRows[0].Cells["CodigoProducto"].Value);
                int _cantidad = Convert.ToInt32(dgPedidos.SelectedRows[0].Cells["Cantidad"].Value);
                _cantidad -= 1;

                if (_cantidad < 1)
                {
                    _dtProducto.Rows[dgPedidos.SelectedRows[0].Index].Delete();
                }
                else
                {
                    _dtProducto.Rows[dgPedidos.SelectedRows[0].Index]["Cantidad"] = _cantidad;
                    _dtProducto.Rows[dgPedidos.SelectedRows[0].Index]["SubTotal"] = subTotalProducto(_codigoProducto, _cantidad);
                }
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            txtHora.Text = GetTime();
        }
    }
}
